<?php
declare (strict_types=1);

namespace app\admin\controller;

use app\Request;
use think\exception\ValidateException;
use think\facade\Filesystem;
use think\facade\Validate;
use think\facade\View;
use app\admin\model\Goods as GoodsModel;
use think\Image;

// 引入鉴权类
use Qiniu\Auth;

// 引入上传类
use Qiniu\Storage\UploadManager;


class Goods
{
    //
    /**
     * 商品列表
     */
    public function list(Request $request)
    {

        # 请求接口获取数据
//        $url = 'http://www.2004a.com/project/goodsListApi';// 这是自己写的接口、模拟
//        $url = 'http://apis.juhe.cn/mobile/get?key=ec867a84abb919086e2940f979880a8f&phone=16696341326';// 请求别人的接口
//
//        $data = file_get_contents($url);
//
//        dd($data);


        # 分类的搜索条件
        # 查询出分类信息
        $category = \app\admin\model\Category::select();

//        $name = \request()->param('goods_name');// 通过助手函数 tp提供给我们的
        $name = $request->param('goods_name');

//        方法一、 表达式
        // 查询数据
        $data = GoodsModel::where('goods_name', 'like', "%$name%")->order('id', 'desc')->paginate([
            'list_rows' => 3,// 每页显示的条数
            'query' => [
                'goods_name' => $name
            ],//额外的参数
        ]);//分页查询数据

        // 方法二  条件是数组
//        $where = [
//            [
//                'goods_name','like',$name
//            ],
//        ];
//
//        $data = \app\admin\model\Goods::where($where)->paginate(3);//分页查询数据

        View::assign('data', $data);//assign('模版使用的名称','查询出来的数据');
        View::assign('name', $name);// 回填到表单里面
        View::assign('category', $category);// 分类的信息

        return View::fetch('/goods_list');
    }

    /**
     * 删除数据
     */
    public function del(Request $request)
    {
        $ids = $request->all('ids');

        # 判断 已上架的商品不能删除 0 已下架 1 已上架 2 预售中
        $isOnSal = GoodsModel::where('goods_status', '>', 0)->whereIn('id', $ids)->select();
        if (!empty($isOnSal)) {
            return json(['code' => 2002, 'msg' => '删除的商品中有上架或预售的、不能删除', 'data' => []]);
        }

        $result = GoodsModel::destroy($ids);
        if ($result) {
            return json(['code' => 200, 'msg' => 'ok', 'data' => []]);
        } else {
            return json(['code' => 2001, 'msg' => '删除失败', 'data' => []]);
        }
    }

    /**
     * 添加页面展示
     */

    public function goodsAdd()
    {
//        return \view('/goods_add');

        # 先查询一级分类
        $category_one = \app\admin\model\Category::where('pid','=',0)->select();
        View::assign('category_one',$category_one);
        return View::fetch('/goods_add');
    }

    /**
     * 获取父级下面的子分类
     * @return \think\response\Json
     */
    public function getCategory(){
        $id = \request()->get('id');// 父级id
        $data = \app\admin\model\Category::where('pid','=',$id)->select()->toArray();
        return json(['data' => $data,'msg' => 'ok','code' => 200]);
    }

    /**
     * 保存入库
     */
    public function goodsSave(Request $request)
    {


        // 唯一验证
        /**
         * 商品名称  "  商品名称  "
         * 去除空格
         */

        $param = \request()->all();
        $param['goods_name'] = trim($param['goods_name']);
//dd($param);
        # 验证器 创建验证器
        try {
            // 代码体

            // 验证token
            $check = $request->checkToken('__token__');

            if (false === $check) {
                throw new ValidateException('invalid token');
            }

            # 创建独立验证器 方法一 php think make:validate admin@Goods
            validate(\app\admin\validate\Goods::class)->check($param);

            # 不用创建验证器 通过内置的验证类 rule 验证的规则 message 错误信息
//            $validate = Validate::rule([
//                'goods_name' => 'require',
////                'goods_logo'=> 'require|fileExt:png,jpeg,gif',
//            ])->message([
//                'goods_name.require' => '商品名称不能为空',
////                'goods_logo.require' => '商品log必须上传',
////                'goods_logo.fileExt' => '商品logo格式不正确',
//            ]);
//            $result = $validate->check(['goods_name' => $param['goods_name']]);
//            //验证不通过
//            if (!$result) {
//                dd($validate->getError());// 打印错误信息
//            }
            # 文件上传
            # 把本地文件移动服务器上
            # file_put_contents()向文件中写入内容
            # 移动文件到指定目录
//        move_uploaded_file() 面向过程的一个方法 原生
//        在框架中怎么实现文件上传

            # 接收文件上传的信息
//        $image = \request()->file();//没有指定某个值、接收所有的文件上传信息
            $image = \request()->file('goods_logo');


//            上传至七牛云


        // 需要填写你的 Access Key 和 Secret Key
//            $accessKey = "z6BH7AEcZltkZlff9E3Qtv7-LaRxZVnpjtCxo78H";
//            $secretKey = "CqkG-Lj4AD6TaNbh8qLqtuyDR41U1tX7yifQsMa-";
//            $bucket = "fenglianxing";
//            // 构建鉴权对象
//            $auth = new Auth($accessKey, $secretKey);
//            // 生成上传 Token
//            $token = $auth->uploadToken($bucket);
//            // 要上传文件的本地路径
//            $filePath = './static/admin/img/1.jpg';
//            // 上传到存储后保存的文件名
//            $key = '2.jpg';
//            // 初始化 UploadManager 对象并进行文件的上传。
//            $uploadMgr = new UploadManager();
//            // 调用 UploadManager 的 putFile 方法进行文件的上传。
//            list($ret, $err) = $uploadMgr->putFile($token, $key, $filePath);
//            echo "\n====> putFile result: \n";
//            if ($err !== null) {
//                var_dump($err);
//            } else {
//                var_dump($ret);
//            }
//            die();



            # 实现上传
//        $path = Filesystem::putFile('goods_logo',$image); //默认上传的路径 是runtime目录下面的stroage

            # 指定文件上传的路径、希望上传的文件可以访问、也可以下载
            $path = Filesystem::disk('public')->putFile('goods_logo', $image); // 返回的结果  代表的是路径

            $pathInfos = pathinfo($path);// 返回的是路径信息 路径名、文件名（包含后缀）,文件后缀，文件名（不包括后缀）
            # 生成缩略图
            $image = \think\Image::open('./storage/' . $path);
            $thumb_name = './storage/' . $pathInfos['dirname'] . '/' . $pathInfos['filename'] . '_thumb.' . $pathInfos['extension'];
            // 按照原图的比例生成一个最大为150*150的缩略图并保存为thumb.png
            $image->thumb(200, 200)->save($thumb_name);

            # 上传成功之后、将我们的文件路径保存入库

            # 商品相册上传 （多文件上传）

            $goodsModel = new GoodsModel();// 实例化模型
            $goodsModel->goods_name = htmlspecialchars($param['goods_name']);//赋值 转化的思想
            $goodsModel->goods_price = $param['goods_name'];
            $goodsModel->goods_logo = str_replace('./storage', '', $thumb_name);

            $goodsModel->goods_introduce = filter_data($param['goods_desc']);

            $goodsModel->save();//调用save方法保存入库

            // 添加成功之后、跳转到列表页面
            return redirect('/admin/goodsList');
        } catch (ValidateException $e) {
            // 验证失败 输出错误信息
            dd($e->getError());
        }
    }

    /**
     * 编辑展示页面
     */
    public function editor()
    {
        $id = \request()->get('id');
        $info = GoodsModel::find($id);
        View::assign('info', $info);//模版复制
        return View::fetch('/goods_edit');//渲染模版
    }

    /**
     *
     */
    public function update()
    {
        try {
            $param = \request()->all();
            // 调用更新验证规则场景 使用同一个验证器类、实现不同的验证规则
            \validate(\app\admin\validate\Goods::class)->scene('update')->check($param);

            $goods = GoodsModel::find($param['id']);
            $goods->goods_name = $param['goods_name'];
            $goods->goods_number = $param['goods_number'];
            $goods->save();

        } catch (ValidateException $validateException) {
            dd($validateException->getError());// 验证不通过的错误信息
        }
    }


    /**
     * 公共函数
     */
    public function commonFunction()
    {

//        echo "我在admin应用里面调用减法";
//
//        dd(sub(3,2));

//        echo md5('123456');
//dd(encrypt_password(123456));
//
//        $res = add(3,2);// 调用公共函数
//        dd($res);

//        if (encrypt_password('123456') != '7c31f1a7b6e7d36664dc787e5d7bc9c8') {
//
//        }
    }

    /**
     * wangEitor富文本编辑器
     */
    public function wangEditor()
    {
        return View::fetch('/wangEditor');
    }

    public function wangAdd()
    {
        dd(\request()->all());
    }

    /**
     * 文件上传
     */
    public function upload()
    {
        $images = \request()->all();
        $return = [
            'errno' => 0,
            'data' => [],
        ];
        foreach ($images as $image) {
            $path = 'http://www.2004a.com/storage/' . Filesystem::disk('public')->putFile('wang', $image);
            $return['data'][] = [
                'url' => $path,
                'alt' => 'wangEditor上传图片',
                'href' => $path
            ];
        }
        return json($return);
    }


    /**
     * 水印
     */
    public function water()
    {
        # 图片水印
//        $images = \think\Image::open('./storage/goods_logo/20220624/5b33d8c9cada9b3fdaa59008dd1c8ed8.jpg');
//        $images->water('./static/TP-logo.png')->save('./5b33d8c9cada9b3fdaa59008dd1c8ed8.jpg');
        # 文字水印
        $images = \think\Image::open('./storage/goods_logo/20220624/5b33d8c9cada9b3fdaa59008dd1c8ed8.jpg');
        $images->text('2004A全体学生', getcwd() . '/static/font.ttf', 14, '#FFFFFF', Image::WATER_NORTHWEST)->save('./5b33d8c9cada9b3fdaa59008dd1c8ed8_font.jpg');


        # 添加的时候使用图片
//        $goods_logo = \request()->file('goods_logo');
//        $path = Filesystem::disk('public')->putFile('goods_logo',$goods_logo);
//        $pathInfos =   pathinfo($path);// 返回的是路径信息 路径名、文件名（包含后缀）,文件后缀，文件名（不包括后缀）
//        # 生成缩略图
//        $water_name = './storage/'.$pathInfos['dirname'].'/'.$pathInfos['filename'].'_water.'.$pathInfos['extension'];
//        $images = \think\Image::open('./storage/'.$path);
//        $images->water('./static/TP-logo.png')->save($water_name);


        # 添加文字水印
//        $goods_logo = \request()->file('goods_logo');
//        $path = Filesystem::disk('public')->putFile('goods_logo',$goods_logo);
//        $pathInfos =   pathinfo($path);// 返回的是路径信息 路径名、文件名（包含后缀）,文件后缀，文件名（不包括后缀）
//        # 生成缩略图
//        $font_name = './storage/'.$pathInfos['dirname'].'/'.$pathInfos['filename'].'_font.'.$pathInfos['extension'];
//        $images = \think\Image::open('./storage/'.$path);
//        $images->text('2004A全体学生',getcwd().'./static/font.ttf','14px','#FFFFFF')->save($font_name);
    }


    /**
     * 状态的即点即改
     */
    public function statusUpdate()
    {
        $id = \request()->post('id');
        $info = \app\admin\model\Goods::find($id);
        $info->goods_status = $info->goods_status == 1 ? 2 : 1;
        $info->save();
        return json(['code' => 200, 'msg' => 'ok', 'data' => []]);
    }
}
